discrete logarithm problem cryptography